<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="uec713444" id="uec713444"><br></p>
  <h1 data-lake-id="rcNLh" id="rcNLh"><span data-lake-id="uba15e5fa" id="uba15e5fa">典型回答</span></h1>
  <p data-lake-id="u3662f1a9" id="u3662f1a9"><br></p>
  <p data-lake-id="ub8c37ee4" id="ub8c37ee4"><span data-lake-id="u4d768cce" id="u4d768cce">MySQL 实现唯一索引的底层原理是基于 B+ 树索引结构。在实现唯一索引时，MySQL 会在 B+ 树上的每个节点上都添加</span><strong><span data-lake-id="u1af82e71" id="u1af82e71">一个指向唯一性索引值的指针（也称为“唯一性检查器”）</span></strong><span data-lake-id="u98687e8e" id="u98687e8e">。当在索引列上插入新值时，MySQL 会先使用 B+ 树查找该值是否存在。</span></p>
  <p data-lake-id="ub8d1caed" id="ub8d1caed"><span data-lake-id="uef17bbcb" id="uef17bbcb">​</span><br></p>
  <p data-lake-id="ud1bf87be" id="ud1bf87be"><span data-lake-id="u8344849b" id="u8344849b">如果该值已经存在，就会触发唯一性检查器，检查索引列中是否已经存在相同的值。如果唯一性检查器返回了错误，就会抛出唯一性约束冲突的异常，否则就可以插入新值。</span></p>
  <p data-lake-id="uf5e7978d" id="uf5e7978d"><span data-lake-id="u6e7ce9e5" id="u6e7ce9e5">​</span><br></p>
  <p data-lake-id="ub7de3b55" id="ub7de3b55"><span data-lake-id="u24b2323f" id="u24b2323f">在更新索引列时，MySQL 也会先使用 B+ 树查找目标记录，然后触发唯一性检查器，检查索引列中是否已经存在相同的值。如果新值和原值相同，就直接返回。如果新值和原值不同，就会检查新值是否已经存在。如果新值已经存在，就会抛出唯一性约束冲突的异常，否则就可以更新该记录</span></p>
  <p data-lake-id="ubb0368b7" id="ubb0368b7"><br></p>
  <h1 data-lake-id="bFxuE" id="bFxuE"><span data-lake-id="u6d2c7a11" id="u6d2c7a11">扩展知识</span></h1>
  <p data-lake-id="ud62c824d" id="ud62c824d"><br></p>
  <h2 data-lake-id="CtKRU" id="CtKRU"><span data-lake-id="u63b9cafa" id="u63b9cafa">唯一索引允许NULL值吗？</span></h2>
  <p data-lake-id="u016a87a9" id="u016a87a9"><br></p>
  <p data-lake-id="u5dc14065" id="u5dc14065"><span data-lake-id="u228ea6e0" id="u228ea6e0">唯一索引在 MySQL 中可以允许 NULL 值的，但是这些NULL的表现是未知的，未知就是他们不相等，但是也不能说他们不等。</span></p>
  <p data-lake-id="u3287b0fc" id="u3287b0fc"><span data-lake-id="u61b395e9" id="u61b395e9">​</span><br></p>
  <h2 data-lake-id="oLr1q" id="oLr1q"><span data-lake-id="ua4b5dc39" id="ua4b5dc39">唯一性索引查询更快吗？</span></h2>
  <p data-lake-id="u9498ff38" id="u9498ff38"><br></p>
  <p data-lake-id="u6d58b6d9" id="u6d58b6d9"><span data-lake-id="u1c573965" id="u1c573965">在数据库中，通过唯一性索引来创建唯一性约束，可以保证表中指定列的值唯一，避免数据重复和错误插入。</span></p>
  <p data-lake-id="u06bf8128" id="u06bf8128"><span data-lake-id="u594f5264" id="u594f5264">​</span><br></p>
  <p data-lake-id="u5c105b97" id="u5c105b97"><strong><span data-lake-id="ue8c346c4" id="ue8c346c4">唯一性索引查询通常会比非唯一性索引查询更快</span></strong><span data-lake-id="u8d316283" id="u8d316283">，因为唯一性索引能够快速定位到唯一的记录，而非唯一性索引则需要扫描整个索引并匹配符合条件的记录。</span></p>
  <p data-lake-id="u025b6adf" id="u025b6adf"><span data-lake-id="ubd079adb" id="ubd079adb">​</span><br></p>
  <p data-lake-id="u4e8b93ef" id="u4e8b93ef"><span data-lake-id="u67368db6" id="u67368db6">在应用中，如果我们能够设计合适的唯一性索引，也可以有效地提升查询性能和数据质量。</span></p>
  <p data-lake-id="u2137ad27" id="u2137ad27"><span data-lake-id="ub97ad525" id="ub97ad525">​</span><br></p>
  <h2 data-lake-id="DSXPl" id="DSXPl"><span data-lake-id="u136ae9a9" id="u136ae9a9">唯一性索引有什么缺点吗？</span></h2>
  <p data-lake-id="u0fe947dc" id="u0fe947dc"><br></p>
  <p data-lake-id="u9efb3e5d" id="u9efb3e5d"><span data-lake-id="u15626894" id="u15626894">没有银弹，所以一定有缺点。</span></p>
  <p data-lake-id="ua04d3569" id="ua04d3569"><span data-lake-id="u4e8ab875" id="u4e8ab875">​</span><br></p>
  <p data-lake-id="ub6cd5673" id="ub6cd5673"><span data-lake-id="ua76258b1" id="ua76258b1">首先，唯一性索引需要保证索引列的唯一性，因此在插入数据时需要检查是否存在相同的索引值，这会对插入性能产生一定的影响。</span></p>
  <p data-lake-id="uecdf8291" id="uecdf8291"><span data-lake-id="ua2d8fe77" id="ua2d8fe77">​</span><br></p>
  <p data-lake-id="u3c192c0e" id="u3c192c0e"><span data-lake-id="u6364489c" id="u6364489c">如果需要更新唯一性索引列的值，需要先删除旧记录，再插入新记录，这会对更新操作的成本产生影响。</span></p>
  <p data-lake-id="ua29d9cef" id="ua29d9cef"><span data-lake-id="uef3f7d31" id="uef3f7d31">​</span><br></p>
  <p data-lake-id="u5b341425" id="u5b341425"><span data-lake-id="ud6f684ea" id="ud6f684ea">​</span><br></p>
  <p data-lake-id="u17c67b3a" id="u17c67b3a"><span data-lake-id="ua7cb3421" id="ua7cb3421">​</span><br></p>
  <p data-lake-id="u1feec75b" id="u1feec75b"><br></p>
 </body>
</html>